package com.david.course_design.shopping_center.module.login.controller;

import com.david.course_design.shopping_center.module.login.VO.LoginVo;
import com.david.course_design.shopping_center.module.login.VO.RegisterVo;
import com.david.course_design.shopping_center.module.user.service.UserService;
import com.david.course_design.shopping_center.result.ResultBody;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.UUID;

@RestController
@Api(tags = "登录/注册接口")
@RequestMapping("Login/")
public class LoginController {

    @Resource
    private UserService userService;

    @ApiOperation("登录时调用的接口，获取token及登录的验证")
    @PostMapping("LoginInterface")
    private ResultBody LoginInterface(@RequestBody LoginVo loginVo) {
        //  查询数据库中用户的信息
        LoginVo userInformation = userService.LoginInterface(loginVo);

        if (userInformation == null) {
            // 如果用户不存在
            return new ResultBody(401, "账号或密码输入错误", null);
        }

        //  创建token
        String token = UUID.randomUUID().toString().replace("-", "") +
                "%#%" + System.currentTimeMillis() +
                "%#%" + UUID.randomUUID().toString().replace("-", "");

        //  保存token/**/
        userInformation.setToken(token);

        // 设置 token 过期时间为 2 小时(转换成毫秒)
        userInformation.setTokenTimeliness(2 * 60 * 60 * 1000L);

        String password = userInformation.getPassword();
        char[] chars = password.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            chars[i] = (char) (chars[i] ^ 123456);
        }

        password = new String(chars);

        userInformation.setPassword(password);

        // 将保存了token的用户信息传入前端
        return ResultBody.success(userInformation);

    }

    @ApiOperation("注册时调用的接口")
    @PostMapping("RegisterInterface")
    private ResultBody RegisterInterface(@RequestBody RegisterVo registerVo) {

        LoginVo loginVo = new LoginVo();

        loginVo.setName(registerVo.getName());
        loginVo.setPassword(registerVo.getPassword());

        //  查询数据库中用户的信息
        LoginVo userInformation = userService.LoginInterface(loginVo);

        //  如果数据库中存在当前用户的信息
        if (userInformation != null) {
            //  提示用户已存在，不需要重复注册
            System.out.println("用户 【 "+registerVo.getName()+" 】 已经存在于数据库中，请勿重复添加！！");
            //  返回用户已经存在信息到前端
            return ResultBody.error("-1");
        } else {
            //  如果数据库中不存在当前用户的信息，执行注册操作
            
            //  执行插入数据库的操作并返回数据库受影响的行数
            Integer addUserInformationByNameAndPassword = userService.addUserInformationByNameAndPassword(registerVo);

            if (addUserInformationByNameAndPassword == 1) {
                //  插入数据到数据库中成功
                
                //  输出日志
                System.out.println("成功添加到数据库；\n当前添加的对象的用户名为 ==> "+loginVo.getName()+ " 密码为 ==> "+loginVo.getPassword());

                //  返回成功信息到前端
                return ResultBody.success("1");
            } else {
                //  插入数据到数据库中失败
                
                //  输出日志
                System.out.println("插入数据到数据库失败");

                //  返回失败信息到前端
                return ResultBody.error("0");
            }

        }

    }
}
